<?php
namespace app\common\model;

use think\Model;
use think\Db;

class UserWx extends Model
{
    /*
     * 此处为正确的模型初始化
     * init必须是静态方法，并且只在第一次实例化的时候执行
     * protected static function init() {
     * //TODO:初始化内容
     * }
     */
    
    // 新增用户
    public function addWxUser($wxUserInfo) {
        $id = $this->save($wxUserInfo);
        return $id;
    }
    
    // 更新用户信息
    public function updateWxUser($wxUserId, $wxUserInfo) {
        $this->save($wxUserInfo, ['id' => $wxUserId]);
    }
    
    // 注册新微信用户
    // step1: 开启事务，先插入user_wx表，获得wx_user_id
    // step2: 拼装user表数据，插入user表，获得user_id
    // step3: 将user_id更新到user_wx表
    public function registerWxUser($wxUserInfo) {
        $res = array();
        $res['status'] = 250;
        $res['txt'] = lang('register failed');
        $res['data']['userId'] = 0;
        
        Db::startTrans();
        try {
            // step1
            $wxUserId = Db::name('user_wx')->insertGetId($wxUserInfo);
            $wxUserId ? $addWxUserFlag = TRUE : $addWxUserFlag = FALSE;
            
            // step2
            $userData = [
                'is_wx_user' => 1,
                'wx_user_id' => $wxUserId
            ];
            $userId = Db::name('user')->insertGetId($userData);
            $userId ? $addUserFlag = TRUE : $addUserFlag = FALSE;
            
            if($addWxUserFlag && $addUserFlag){
                // step3
                $updateWxUserInfo = [
                    'user_id' => $userId
                ];
                $updataWxUser = Db::name('user_wx')->where('id', $wxUserId)->update($updateWxUserInfo);
                
                if($updataWxUser > 0){
                    Db::commit();
                    $res['data']['userId'] = intval($userId); // 转为整数，避免jwt生成后产生其他错误
                    $res['status'] = 200;
                    $res['txt'] = lang('register success');
                }else{
                    Db::rollback();
                }
            }else {
                Db::rollback();
            }
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
        }
        
        return $res;
    }
}